import 'dart:convert';

import 'package:json_annotation/json_annotation.dart';

part 'xunfei_voice_dictation.g.dart';

///
/// 讯飞-语音识别-语音听写的返回结果
/// https://www.xfyun.cn/doc/asr/voicedictation/API.html
///
@JsonSerializable(explicitToJson: true)
class XunfeiVoiceDictation {
  // 本次会话的id，只在握手成功后第一帧请求时返回
  String? sid;
  // 返回码，0表示成功，其它表示异常，详情请参考错误码
  int? code;
  // 错误描述
  String? message;
  // 听写结果信息(XVD前缀：XunfeiVoiceDictation，讯飞语音听写)
  XVDData? data;

  XunfeiVoiceDictation(this.sid, this.code, this.message, this.data);

  // 从字符串转
  factory XunfeiVoiceDictation.fromRawJson(String str) =>
      XunfeiVoiceDictation.fromJson(json.decode(str));
  // 转为字符串
  String toRawJson() => json.encode(toJson());

  factory XunfeiVoiceDictation.fromJson(Map<String, dynamic> srcJson) =>
      _$XunfeiVoiceDictationFromJson(srcJson);

  Map<String, dynamic> toJson() => _$XunfeiVoiceDictationToJson(this);
}

@JsonSerializable(explicitToJson: true)
class XVDData {
  // 识别结果是否结束标识：0：识别的第一块结果，1：识别中间结果，2：识别最后一块结果
  int? status;
  // 听写识别结果
  //  在XVDData里面的result
  XVDDataResult? result;

  XVDData(this.status, this.result);

  // 从字符串转
  factory XVDData.fromRawJson(String str) => XVDData.fromJson(json.decode(str));
  // 转为字符串
  String toRawJson() => json.encode(toJson());

  factory XVDData.fromJson(Map<String, dynamic> srcJson) =>
      _$XVDDataFromJson(srcJson);

  Map<String, dynamic> toJson() => _$XVDDataToJson(this);
}

@JsonSerializable(explicitToJson: true)
class XVDDataResult {
  // 返回结果的序号
  int? sn;
  // 是否是最后一片结果
  bool? ls;
  // 保留字段，无需关心
  int? bg;
  // 保留字段，无需关心
  int? ed;
  // 听写结果
  List<XVDDataResultWs>? ws;

  XVDDataResult(this.ls, this.bg, this.ed, this.ws, this.sn);

  // 从字符串转
  factory XVDDataResult.fromRawJson(String str) =>
      XVDDataResult.fromJson(json.decode(str));
  // 转为字符串
  String toRawJson() => json.encode(toJson());

  factory XVDDataResult.fromJson(Map<String, dynamic> srcJson) =>
      _$XVDDataResultFromJson(srcJson);

  Map<String, dynamic> toJson() => _$XVDDataResultToJson(this);
}

@JsonSerializable(explicitToJson: true)
class XVDDataResultWs {
  // 起始的端点帧偏移值，单位：帧（1帧=10ms）
  //  注：以下两种情况下bg=0，无参考意义：1)返回结果为标点符号或者为空；2)本次返回结果过长。
  int? bg;

  // 中文分词
  List<XVDDataResultWsCw>? cw;

  XVDDataResultWs(this.bg, this.cw);

  // 从字符串转
  factory XVDDataResultWs.fromRawJson(String str) =>
      XVDDataResultWs.fromJson(json.decode(str));
  // 转为字符串
  String toRawJson() => json.encode(toJson());

  factory XVDDataResultWs.fromJson(Map<String, dynamic> srcJson) =>
      _$XVDDataResultWsFromJson(srcJson);

  Map<String, dynamic> toJson() => _$XVDDataResultWsToJson(this);
}

@JsonSerializable()
class XVDDataResultWsCw extends Object {
  // 字词
  String? w;
  // sc/wb/wc/we/wp 均为保留字段，无需关心。如果解析sc字段，建议float与int数据类型都做兼容
  int? sc;

  XVDDataResultWsCw(this.sc, this.w);

  // 从字符串转
  factory XVDDataResultWsCw.fromRawJson(String str) =>
      XVDDataResultWsCw.fromJson(json.decode(str));
  // 转为字符串
  String toRawJson() => json.encode(toJson());

  factory XVDDataResultWsCw.fromJson(Map<String, dynamic> srcJson) =>
      _$XVDDataResultWsCwFromJson(srcJson);

  Map<String, dynamic> toJson() => _$XVDDataResultWsCwToJson(this);
}
